package org.simplesocket.simplenettycore.handlers;

import org.simplesocket.simplenettycore.context.SimpleNettyContext;

public class PipelineInitializer {

    /**
     * 解释一下，为什么会有这个类：
     * <p/>
     * 在设置pipeline的时候，完全可以使用 pipeline.addLast(new Handler()) 就行了，
     * 这里这么做的原因是，在处理器中有一些开发者关注的事件，例如客户端连接、客户端断开连接、
     * 客户端重连等等，如果不提供某种方式，开发者无法侵入处理器代码，也就无法监控到这些事件
     * 的发生，于是便写了这个类
     * <p/>
     * 原理是：
     * <p/>
     *  提供一个注解和一个接口，开发者需要实现这个接口，并且在实现类上加上注解，服务器启动
     *  时会扫描开发者自定义的整个包，利用反射找到用户的实现类，实例化它并将它注入到下面的
     *  clientEventCallbackWrapper中，于是我们的处理器便可以拿到这个开发者实现类实例，
     *  拿到这个实例后就能调用开发者自定义的方法，因为实现类实现了我们定义的接口，所以我们
     *  知道要调用哪些方法，这一整套下来就完成了开发者回调。
     */

    // 这里必须将用户实现类实例包装在这里，因为ConnectLifecycleHandler不能为单例，否则客户端不能二次连接服务器
    public static ClientEventCallback clientEventCallbackWrapper;// 动态注入
    
    public static ConnectLifecycleHandler getConnectLifecycleHandler(SimpleNettyContext context){
        return new ConnectLifecycleHandler(context,clientEventCallbackWrapper);
    }

    public static ProtocolCodecHandler getProtocolCodecHandler(){
        return new ProtocolCodecHandler();
    }
    
    public static EncryptHandler getEncryptHandler() {
        return new EncryptHandler();
    }
    
    public static DecryptHandler getDecryptHandler() {
        return new DecryptHandler();
    }
    
    public static DistributeRouteHandler getDistributeRouteHandler(SimpleNettyContext context) {
        return new DistributeRouteHandler(context);
    }
}
